package com.es.spring_es.clientmap;

import org.frameworkset.elasticsearch.client.ClientInterface;
import org.frameworkset.elasticsearch.entity.ESDatas;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author xu
 * @date 2020/6/3
 * @desciption Es操作类
 */
@Service
public class EsUtils {

    /**
     * 创建表结构
     */
    public void CreateDriverLocationMainIndice(String index,String dsl){
        try {
            ClientInterface clientUtil = EsClientMap.restClient();

            //创建索引表
            clientUtil.createIndiceMapping(index,//索引表名称
                    dsl);//索引表mapping dsl脚本名称，

            String demoIndice = clientUtil.getIndice(dsl);//获取最新建立的索引表结构
            System.out.println(demoIndice);

            boolean exist = clientUtil.existIndice(index);

            if(exist) {
               /* String r = clientUtil.dropIndice(index);
                System.out.println(r);
                exist = clientUtil.existIndice(index);
                String demoIndice = clientUtil.getIndice(index);//获取最新建立的索引表结构
                System.out.println(demoIndice);*/
            }else {
              /*  //创建索引表
                clientUtil.createIndiceMapping(index,//索引表名称
                        dsl);//索引表mapping dsl脚本名称，

                String demoIndice = clientUtil.getIndice(dsl);//获取最新建立的索引表结构
                System.out.println(demoIndice);*/
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 添加或修改文档
     */
    public String addOrUpdateDocument(String index,Object obj){
        //获取文档的客户端对象，单实例多线程安全
        ClientInterface clientUtil = EsClientMap.restClient();
        //向固定index添加或者修改文档,如果id已经存在做修改操作，否则做添加文档操作，返回处理结果
        //索引表 索引类型
        return clientUtil.addDocument(index, obj);
    }

    /**
     * 添加或修改文档
     */
    public <T> void addOrUpdateDocuments(String index,List<T> list){
        //获取文档的客户端对象，单实例多线程安全
        ClientInterface clientUtil = EsClientMap.restClient();
        //向固定index添加或者修改文档,id，否则做添加文档操作，返回处理结果
        //索引表 索引类型
        clientUtil.addDocuments(index, index, list,"refresh");
       // clientUtil.addDocuments(index,index,list);
    }
    /**
     * 获取文档
     */
    public String getDocumentById(String index,String id){
        //获取文档的客户端对象，单实例多线程安全
        ClientInterface clientUtil = EsClientMap.restClient();
        //索引表 索引类型 id
        String res = clientUtil.getDocument(index,index,id);
        return res;
    }
    /**
     * 获取文档
     */
    public <T> T getDocumentById(String index,String id,Class<T> t){
        //获取文档的客户端对象，单实例多线程安全
        ClientInterface clientUtil = EsClientMap.restClient();
        //索引表 索引类型 id 对象
        return clientUtil.getDocument(index,index,id,t);
    }

    /**
     * 获取文档下所有数据
     */
    public <T> List<T> getDocumentDataAll(String index,Class<T> t ){
        ClientInterface clientUtil = EsClientMap.restClient();
        return clientUtil.searchAll(index,t).getDatas();
    }

    /**
     * 删除文档
     */
    public void deleteDocumentById(String index,String id){
        //获取文档的客户端对象，单实例多线程安全
        ClientInterface clientUtil = EsClientMap.restClient();
        //索引表 索引类型 id 对象
        clientUtil.deleteDocument(index,index,id);
    }
    /**
     * 删除文档
     */
    public void deleteDocumentByIds(String index,String[] ids){
        //获取文档的客户端对象，单实例多线程安全
        ClientInterface clientUtil = EsClientMap.restClient();
        StringBuilder builder = new StringBuilder();
        String[] var5 = ids;
        for(int i = 0; i < ids.length; ++i) {
            String id = ids[i];
            builder.append("{ \"delete\" : { \"_index\" : \"").append(index).append("\", \"_type\" : \"").append(index).append("\", \"_id\" : \"").append(id).append("\" } }\n");
        }
        //索引表 索引类型 id 对象
        clientUtil.executeHttp("_bulk",builder.toString(),"post");
    }

    /**
     * 通过mapper文件执行查询语句
     * @param index 索引
     * @param params 传递的参数
     * @param dsl 对应mapper文件的name
     * @
     */
    public <T> List<T> exec(String index,Object params,String dsl,Class<T> t){
        //获取索引对应的客户端
        ClientInterface clientUtil = EsClientMap.restClient(index);
        //设定查询条件,通过map传递变量参数值,key对于dsl中的变量名称
        //执行查询，index为索引表，_search为检索操作action
        //使用反射获取Class<T>
       // Class<T> clazz = GenericsUtils.getSuperClassGenricType(params.getClass());
        ESDatas<T> esDatas =  //ESDatas包含当前检索的记录集合，最多1000条记录，由dsl中的size属性指定
                clientUtil.searchList(index+"/_search",//demo为索引表，_search为检索操作action
                        dsl,//esmapperx.xml中定义的dsl语句的name
                        params,//变量参数
                        t);//返回的文档封装对象类型
        //获取结果对象列表，最多返回1000条记录
        List<T> list = esDatas.getDatas();
        /*//获取总记录数
        long totalSize = esDatas.getTotalSize();*/
        return list;
    }


}
